15647
900
Şu anda bir XML çeşidi için temel bir ayrıştırıcı yazıyorum. Alıştırma olarak, LL tablosu tabanlı bir ayrıştırıcı uyguluyorum.
Bu benim BNF dilbilgisi örneğim:
% simge adı veri dizesi
%% / * LL (1) * /
doc: elem
elem: "<" open_tag
open_tag: ad attr close_tag
close_tag: ">" elem_or_data ""
| "/>"
;
elem_or_data: "<" open_tag elem_or_data
| veri elem_or_data
| / * epsilon * /
;
attr: ad ":" dize öznitelik
| / * epsilon * /
;
Bu dilbilgisi doğru mu?
Her uçbirim değişmezi tırnak işaretleri arasındadır. Soyut uçbirimler% belirteci ile belirtilir.
Girdiğimi bir simge listesine dönüştürmek için elle yazılmış bir sözlüğü kodluyorum. Soyut terminalleri nasıl belirtebilirim? 
Klasik yaklaşım, olası her uçbirim için bir düzenli ifade (veya başka bir tanıyıcı) yazmak olacaktır.
Tamamen somut olan "soyut" terminaller dediğiniz şey, aslında ilişkili kalıpları birden fazla olası girdi dizgesini tanıyan terminallerdir. Gerçekte tanınan dize (veya bu dizenin bazı hesaplanan işlevleri), belirtecin anlamsal değeri olarak ayrıştırıcıya aktarılmalıdır.
Nominal olarak, giriş dizesindeki her noktada, belirteç tüm tanıyıcıları çalıştıracak ve en uzun eşleşmeye sahip olanı seçecektir. (Bu, sözde "maksimal munch" kuralıdır.) Bu, özellikle tüm desenler düzenli ifadeler ise, genellikle optimize edilebilir. Örneğin (F) lex bu optimizasyonu sizin için yapacak.
Sizin durumunuzdaki bir komplikasyon, dilinizin belirtilmesinin içeriğe bağlı olmasıdır. Özellikle, hedef elem_or_data olduğunda, olası tek simgeler <,